package com.juben.svr.service;

import com.juben.svr.domain.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Service;


import java.util.Date;
//创建 Token 生成方法
@Service
public class TokenService {
    private final String SECRET_KEY = "your_secret_key"; // 请使用更安全的密钥
    private final int EXPIRATION_TIME  = 36 * 60 * 1000; // 5分钟

    public String generateTokenForUser(User user) {
        System.out.println("generateTokenForUser==start");
        System.out.println("generateTokenForUser==user:"+user);
        return Jwts.builder()
                .setSubject(String.valueOf(user.getUID())) // 将用户 ID 作为 subject，或使用自定义声明
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }
    //，从 JWT 中提取用户 ID方法。这可以通过解析 JWT 并获取 subject（或自定义声明）来实现
    public Integer getUserIdFromToken(String token) {
        System.out.println("getUserIdFromToken==start"+isTokenExpired(token));
        if (!isTokenExpired(token)) {
            System.out.println("getUserIdFromToken==start");
            // 从 token 中解析出用户 ID
            System.out.println("token:" + token);
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
            System.out.println("claims:" + claims);
            // 获取 subject 值
            String subject = claims.getSubject();
            System.out.println("subject:" + subject);
            Integer userId = Integer.valueOf(claims.getSubject());
            System.out.println("getUserIdFromToken=>userId:" + userId);
            return userId;
        }else {
            return null;
        }
    }

    public boolean validateToken(String token, Long userId) {
        final Integer id = getUserIdFromToken(token);
        return (id.equals(userId) && !isTokenExpired(token));   // 检查是否过期
    }

    // 检查是否过期
    private boolean isTokenExpired(String token) {
        try {
            final Date expiration = getExpirationDateFromToken(token);
            System.out.println("有效期至: " + expiration);
            System.out.println("当前时间: " + new Date());
            return expiration.before(new Date());       // 判断是否过期
        }catch (ExpiredJwtException e) {
            // 处理过期JWT的情况
            System.out.println("JWT已过期，请重新登录！");
            return true;
        }

    }

    public Date getExpirationDateFromToken(String token) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
            return claims.getExpiration(); // 获取过期时间
        } catch (ExpiredJwtException e) {
            // 如果在这里也捕获到过期异常，可以选择抛出或处理
            throw e;
        }

    }
}
